package user

import (
	"fmt"

	"gitee.com/liumou_site/PasswordReset/config"
	"gitee.com/liumou_site/PasswordReset/password"
	"gitee.com/liumou_site/gcs"
	"gitee.com/liumou_site/logger"
)

// Manager 用户管理器
type Manager struct {
	users []*config.UserConfig
	Cmd   gcs.ApiShell
}

// NewManager 创建新的用户管理器
func NewManager() (*Manager, error) {
	// 初始化安全密钥管理器
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		return nil, fmt.Errorf("初始化密钥管理器失败: %v", err)
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		return nil, fmt.Errorf("获取主密钥失败: %v", err)
	}

	// 加载所有用户配置
	users, err := config.LoadAllUserConfigs(key)
	if err != nil {
		return nil, err
	}

	return &Manager{users: users, Cmd: *gcs.NewShell()}, nil

}

// ProcessAllUsers 处理所有用户的密码重置
func (m *Manager) ProcessAllUsers() {
	logger.Info("开始处理所有用户的密码重置，共 %d 个用户", len(m.users))

	// 初始化安全密钥管理器用于删除配置
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		logger.Error("初始化密钥管理器失败: %v", err)
		return
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		logger.Error("获取主密钥失败: %v", err)
		return
	}

	// 创建需要删除的用户列表
	var usersToRemove []string

	// 处理所有用户
	for _, user := range m.users {
		logger.Info("检查用户: %s", user.Username)

		// 检查系统用户是否存在
		exists, err := checkSystemUserExists(user.Username)
		if err != nil {
			logger.Error("检查用户 %s 失败: %v", user.Username, err)
			continue
		}

		if !exists {
			// 如果用户不存在且设置为自动创建，则记录日志但不删除配置
			if user.AutoCreateUser {
				logger.Info("系统用户 %s 不存在，根据配置将自动创建", user.Username)
			} else {
				// 只有在未启用自动创建时才删除配置
				logger.Warn("系统用户 %s 不存在且未启用自动创建，将删除对应的配置文件", user.Username)
				usersToRemove = append(usersToRemove, user.Username)
				continue
			}
		}

		logger.Info("处理用户: %s", user.Username)
		// 创建密码重置实例，根据密码模式选择前缀或后缀
		var pr *password.Reset
		if user.PasswordPrefix {
			pr = password.NewPasswordResetWithPrefix(user.Username, user.Password)
		} else {
			pr = password.NewPasswordResetWithSuffix(user.Username, user.Password)
		}

		// 执行用户管理操作
		pr.AddUser()
		pr.AddWheel()
		pr.ChangeUserPassword()
		pr.DisableUserSSH()
	}

	// 删除不存在的用户配置
	for _, username := range usersToRemove {
		if err := config.DeleteUserConfig(username, key); err != nil {
			logger.Error("删除用户 %s 配置失败: %v", username, err)
		} else {
			logger.Info("已删除不存在的用户配置: %s", username)
		}
	}

	// 重新加载配置以同步状态
	if len(usersToRemove) > 0 {
		if err := m.ReloadConfig(); err != nil {
			logger.Error("重新加载配置失败: %v", err)
		} else {
			logger.Info("配置已更新，当前用户数量: %d", len(m.users))
		}
	}

	logger.Info("完成所有用户的密码重置处理")
}

// GetUserCount 获取用户数量
func (m *Manager) GetUserCount() int {
	return len(m.users)
}

// checkSystemUserExists 检查系统用户是否存在
func checkSystemUserExists(username string) (bool, error) {
	return UserExists(username)
}

// ReloadConfig 重新加载配置
func (m *Manager) ReloadConfig() error {
	// 初始化安全密钥管理器
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		return fmt.Errorf("初始化密钥管理器失败: %v", err)
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		return fmt.Errorf("获取主密钥失败: %v", err)
	}

	// 重新加载所有用户配置
	users, err := config.LoadAllUserConfigs(key)
	if err != nil {
		return err
	}

	m.users = users
	return nil
}
